#pragma once
#include "../interface/ICore.h"
#include "../interface/IFunctionPlugin.h"
#include "../interface/IUIPlugin.h"
#include "../interface/PluginStruct.h"
#include <QDir>
#include <QPluginLoader>
#include <QMap>
#include <QMutex>
#include <QMultiMap>

class Core : public ICore
{
    Q_OBJECT
public:
    Core();
    ~Core() override;

    // 加载根目录插件，返回是否至少加载了一个插件
    bool loadPluginsFromRootDirectory(const QString& rootDir) override;

    // 查询插件接口
    IUIPlugin* getUIPlugin(const QString& pluginId) const override;
    IFunctionPlugin* getFunctionPlugin(const QString& pluginId) const override;

    QStringList listUIPluginIds() const override;
    QStringList listFunctionPluginIds() const override;

    // 事件订阅，回调参数为事件信息
    void subscribeEvent(const QString& eventName,
                        std::function<void(const PluginInfo&)> callback) override;

    // 事件发布
    void publishEvent(const PluginInfo& event) override;

    // 日志接口，pluginId可以是“Core”或具体插件ID
    void logMessage(const QString& pluginId, const QString& message) override;

private:
    bool loadUIPluginsFromDirectory(const QString& dirPath);
    bool loadFunctionPluginsFromDirectory(const QString& dirPath);
    mutable QMutex m_mutex;

    // 插件容器，存接口指针，外部不要delete
    QMap<QString, IUIPlugin*> m_uiPlugins;
    QMap<QString, IFunctionPlugin*> m_functionPlugins;

    // 插件加载器保持生命周期，避免被自动卸载
    QMap<QString, std::unique_ptr<QPluginLoader>> m_pluginLoaders;

    // 事件订阅存储
    QMultiMap<QString, std::function<void(const PluginInfo&)>> m_eventSubscribers;
};
